<html>

<head>
<title>PyDbLite</title>
</head>

<body>

<style type="text/css">
body, td {
	color: #000000;
	background-color: #ffffff;
	font-family: sans-serif;
	font-size: 13;
	}

pre {
	font-family: arial }

li { padding-bottom:10;
	}

.python {
	color:330099;
	font-family: "Courier New";
	}

td.navigation
{ background-color: #99ccff;
  font-weight: bold;
  font-family: avantgarde, sans-serif;
  font-size: 110%;
  width: 90%}

td.lnk { background-color: #99ccff;
  font-size: 70%;
    }

td.tablename { vertical-align: top;
	text-align: center;
    font-weight: bold;
    }

ol { margin-left : 20px;
	}

</style>

<table width="100%" cellspacing="0"><tr><td class="navigation" align="center">PyDbLite</td>
<td class="lnk" align="right"><a href="index.html">English</a></td>
</tr></table>
<p>PyDbLite est un moteur de base de donn�es en m�moire, en pur Python, qui utilise les "list comprehensions" de Python comme langage de requ�tes au lieu de SQL

<p>Il consiste en un seul petit module, PyDbLite.py. Pour l'installer, il suffit de le <a href="http://sourceforge.net/project/platformdownload.php?group_id=210258">t�l�charger</a> et de le mettre dans le r�pertoire <code>Lib/site-packages</code> de votre distribution Python

<p>Utilisation :

<ul>
<li>importer la classe <CODE>Base</CODE> du module PyDbLite : <span class="python">from PyDbLite import Base</span>

<li>cr�er une instance de base de donn�es,en passant un nom de fichier : <span class="python">db = Base('test')</span>

<li>pour une nouvelle base, d�finissez les noms des champs : <span class="python">db.create('nom','age','taille')</span>

<br>Vous n'avez pas � d�finir le type des champs. PyDbLite accepte toute valeur qui peut �tre s�rialis�e par le module <CODE>cPickle</CODE> : des cha�nes de caract�res, des cha�nes Unicode, des entiers, r�els, dates et dates-heures (instances des classes <CODE>date</CODE> et <CODE>datetime</CODE> dans le module <CODE>datetime</CODE>), des instances de classes d�finies par l'utilisateur, etc

<li>si la base existe d�j�, pour l'ouvrir : <span class="python">db.open()</span>

<li>on peut passer un param�tre "mode" � la m�thode <CODE>create()</CODE>, pour indiquer ce qu'il faut faire si la base existe d�j� sur le disque
<ul>
<li>mode = "open" : <span class="python">db.create('nom','age','taille',mode="open")</span>

ouvre la base en ignorant la d�finition des champs

<li> mode = "override" : <span class="python">db.create('nom','age','taille',mode="override")</span>

efface la base existante et en cr�e une nouvelle avec les d�finitions de champs
<li>si le mode n'est pas pr�cis� et que la base existe d�j�, une exception <CODE>IOError</CODE> est d�clench�e</ul>

<li>insertion d'un nouvel enregistrement
<ul>
<li>par mots-cl�s : <span class="python">db.insert(nom='homer',age=23,taille=1.84)</span>

<br>Si certains champs manquent, ils sont initialis�s � la valeur <CODE>None</CODE>

<li>par arguments positionnels : <span class="python">db.insert('homer',23,1.84)</span>

<br>Les arguments doivent �tre fournis dans le m�me ordre que dans la m�thode <CODE>create()</CODE>
</ul>

<li>pour sauvegarder les changements sur le disque : <span class="python">db.commit()</span>
<br>Si vous ne confirmez pas les changements, les op�rations d'insertion, de suppression et de mise � jour ne seront pas sauvegard�s sur le disque

<li>En plus des champs pass�s � la m�thode <CODE>create()</CODE>, un champ interne appel� <CODE>__id__</CODE> est ajout�. C'est un entier, unique et inchang� pour chaque enregistrement, il peut donc �tre utilis� comme identifiant pour l'enregistrement

<li> un autre champ interne appel� <CODE>__version__</CODE> est �galement g�r� par le moteur de base de donn�es. Il s'agit d'un entier qui est initialis� � 0 quand l'enregistrement est cr��, et incr�ment� de 1 � chaque fois que l'enregistrement est mis � jour. Ceci sert pour la d�tection des acc�s concurrents, par exemple dans une application web dans laquelle deux utilisateurs veulent mettre � jour le m�me enregistrement en m�me temps

<li>la s�lection d'enregistrements utilise la syntaxe des "list comprehensions" de Python :
<br><span class="python">recs = [ r for r in db if 30 > r['age'] >= 18 and r['taille'] < 2 ]</span>

<br>retourne les enregistrements de la base pour lesquels l'�ge est compris entre 18 et 30 ans, et la taille est inf�rieure � 2 m�tres. L'enregistrement est un dictionnaire, o� la cl� est le nom de champ et la valeur est la valeur de ce champ

<li>la syntaxe des g�n�rateurs d'expression Python peut aussi �tre utilis�e :
<br><span class="python">for r in (r for r in db if r['nom'] in ('homer','marge') ):<br>
&nbsp;&nbsp;&nbsp;&nbsp;faire_qqch_avec(r)</span>

<br>it�re sur les enregistrements dont le nom est 'homer' ou 'marge'

<li>pour it�rer sur tous les enregistrements :
<br><span class="python">for r in db:<br>
&nbsp;&nbsp;&nbsp;&nbsp;fais_qqch_avec(r)</span>

<li>on peut acc�der directement � un enregistrement par son identifiant : <span class="python">record = db[rec_id]</span>

retourne l'enregistrement tel que record['__id__'] == rec_id

<li> finalement, un raccourci peut �tre utilis� pour les s�lections simples :
<span class="python">db(cle1=val1,cle2=val2)</span> renvoie la liste des enregistrements dont les cl�s prennent les valeurs donn�es. C'est �quivalent � <span class="python">[ r for r in db if r["cle1"]==val1 and r["cle2"]==val2]</span>, mais en beaucoup plus concis

<li>pour acc�l�rer les s�lections, un index peut �tre cr�� sur un champ : <span class="python">db.create_index('age')</span>

<br>Quand un index est cr��, l'instance de la base de donn�es a un attribut (ici <CODE>_age</CODE> : noter le signe de soulignement initial, pour �viter les conflits de noms avec des noms internes). Cet attribut est un objet de type dictionnaire, o� les cl�s sont les valeurs prises par le champ, et les valeurs sont les enregistrements dont le champ a la m�me valeur que la cl� :
<br><span class="python">records = db._age[23]</span> retourne la liste des enregistrements avec age == 23

<br>Si aucun enregistrement n'a cette valeur, la recherche par cette valeur retourne une liste vide

<br>L'index supporte l'it�ration sur les valeurs du champ, et la m�thode <CODE>keys()</CODE> retourne toutes les valeurs existantes pour le champ

<li>nombre d'enregistrements dans la base : <span class="python">len(db)</span>

<li>pour supprimer un enregistrement : <span class="python">db.delete(record)</span> ou, si vous connaissez l'identifiant : <span class="python">del db[rec_id]</span>

<li>pour supprimer une liste d'enregistrements : <span class="python">db.delete(liste_d_enregistrements)</span>

<br><CODE>liste_d_enregistrements</CODE> peut �tre n'importe quel it�rable (liste, tuple, set, etc) qui produit des enregistrements

<li>pour mettre � jour un enregistrement : <span class="python">db.update(record,age=24)</span>

<li>pour ajouter un nouveau champ � une base existante et sp�cifier une valeur par d�faut : <span class="python">db.add_field('nouveau_champ'[,default=v])</span>. Si le d�faut n'est pas fourni, la valeur du champ est <CODE>None</CODE>

<li>pour supprimer un champ existant : <span class="python">db.drop_field('nom')</span>

<li>pour conna�tre la liste des champs : <span class="python">db.fields</span>

</ul>

</body>
</html>